package sioserver;

import java.awt.DisplayMode;
import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;

/**
 * 为了简单起见，本例中直接在分发器中初始化资源。分发器有两个重要的方法，
 * accept方法接受request并且判断是否有资源给dispatcher，returnResource方法是在任务处理程序执行完后归还资源给分发器。
 * 
 * @author Xinz
 *
 */
public class SIODemultiPlexer {

	// 初始化模拟资源
	private ArrayBlockingQueue<Integer> resources = new ArrayBlockingQueue<Integer>(2);
	{
		resources.add(1);
		resources.add(2);
	}
	
	private ArrayList<Integer> requests = new ArrayList<Integer>(5);
	
	/**
	 * 
	 * @param s
	 * 			获取资源的开始时间
	 * @param timeout
	 * 			 获取资源的超时时间
	 * @return
	 */
	public synchronized Integer getResource(long s, int timeout) {
		for(;;) {
			// 如果超时则抛出异常
			if((System.currentTimeMillis() - s) > timeout) {
				throw new RuntimeException("获取资源超时");
			}
			else if(resources.size() > 0) {
				return resources.poll();
			}
			try {
				Thread.sleep(500);
			}
			catch(InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void returnResources(Integer resourceId) {
		synchronized(resources) {
			resources.add(resourceId);
		}
	}
	
	/**
	 * 接受请求并且分配一个Handler处理
	 * @param requestId
	 */
	public void accept(Integer requestId) {
		requests.add(requestId);
		Integer rid = getResource(System.currentTimeMillis(), 5);
		SIODispatcher d = new SIODispatcher(this, requestId, rid);
		d.createRequestHandler().start();
	}
}
